package utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import models.Enseignant;
import models.Evaluation2;
import models.Intervention;

public class Classement {

	/**
	 * Méthode permettant de calculer la moyenne d'un critére pour un cours
	 * @param i objet type Intervention
	 * @param critere 
	 * @return Moyenne calculée
	 */
	private static double getMoyenneForOneCritere(Intervention i, String critere) {
		List<Double> value = new ArrayList<Double>();
		for (Evaluation2 e : i.listEvaluation2Intervention) {
			if (critere.equalsIgnoreCase("critere1NotePedagogique"))
				value.add(e.critere1NotePedagogique);
			else if (critere.equalsIgnoreCase("critere2NotePedagogique"))
				value.add(e.critere2NotePedagogique);
			else if (critere.equalsIgnoreCase("critere3NotePedagogique"))
				value.add(e.critere3NotePedagogique);
			else if (critere.equalsIgnoreCase("critere1NoteSupport"))
				value.add(e.critere1NoteSupport);
			else if (critere.equalsIgnoreCase("critere2NoteSupport"))
				value.add(e.critere2NoteSupport);
			else if (critere.equalsIgnoreCase("critere3NoteSupport"))
				value.add(e.critere3NoteSupport);
		}

		return Calculator.moyenne(value);
	}

	/**
	 * Méthode calculant la moyenne générale de la partie "support" d'une évaluation
	 * @param e objet de type Evaluation
	 * @return moyenne calculée
	 */
	private static double getMoyenneCourseForEval(Evaluation2 e) {
		List<Double> value = Arrays.asList(e.critere1NoteSupport,
				e.critere2NoteSupport, e.critere3NoteSupport);
		return Calculator.moyenne(value);
	}
	
	/**
	 * Méthode calculant la moyenne générale de la partie "pédagogie" d'une évaluation
	 * @param e objet de type Evaluation
	 * @return moyenne calculée
	 */
	private static double getMoyenneTeachForEval(Evaluation2 e) {
		List<Double> value = Arrays.asList(e.critere1NotePedagogique,
				e.critere2NotePedagogique, e.critere3NotePedagogique);
		return Calculator.moyenne(value);
	}
	
	/**
	 * Méthode calculant la moyenne générale d'une évaluation
	 * @param e objet de type Evaluation
	 * @return moyenne calculée
	 */
	private static double getMoyenneGeneralForEval(Evaluation2 e){
		return Calculator.moyenne(Arrays.asList(getMoyenneCourseForEval(e),getMoyenneTeachForEval(e)));
	}
	
	/**
	 * Méthode calculant la moyenne de chaque critére de notation d'un cours
	 * @param i object de type Intervention
	 * @return Map<key,value> où key = intitulé du critére et value = moyenne de ce critére
	 */
	public static Map<String,Double> getMapMoyenneAllCritere(Intervention i){
		Map<String, Double> mapMoyenneAllCritere = new HashMap<String, Double>();
		mapMoyenneAllCritere.put("Critere 1 p", getMoyenneForOneCritere(i,"critere1NotePedagogique"));
		mapMoyenneAllCritere.put("Critere 2 p", getMoyenneForOneCritere(i,"critere2NotePedagogique"));
		mapMoyenneAllCritere.put("Critere 3 p", getMoyenneForOneCritere(i,"critere3NotePedagogique"));
		mapMoyenneAllCritere.put("Critere 1 s", getMoyenneForOneCritere(i,"critere1NoteSupport"));
		mapMoyenneAllCritere.put("Critere 2 s", getMoyenneForOneCritere(i,"critere2NoteSupport"));
		mapMoyenneAllCritere.put("Critere 3 s", getMoyenneForOneCritere(i,"critere3NoteSupport"));
		return mapMoyenneAllCritere;
	}

	/**
	 * Méthode permettant de calculer la moyenne générale d'un cours
	 * @param i
	 * @return Moyenne calculée
	 */
	public static double getMoyenneGeneraleForIntervention(Intervention i) {
		List<Double> value = new ArrayList<Double>();
		if(!i.listEvaluation2Intervention.isEmpty()){
			for(Evaluation2 e : i.listEvaluation2Intervention){
				value.add(getMoyenneGeneralForEval(e));
			}
		}
		return Calculator.moyenne(value);
	}
	
	
	public static List<Double> getAllMoyenneGeneralForEnseignant(Set<Intervention> listIntervention){
		List<Double> values = new ArrayList<Double>();
		for(Intervention i : listIntervention){
			values.add(getMoyenneGeneraleForIntervention(i));
		}		
		return values;
	}
	
	public static double getMoyenneGeneralForEnseignant(Enseignant e){
		List<Double> value = new ArrayList<Double>();
		for(Intervention i : e.listInterventionEnseignant){
			value.add(getMoyenneGeneraleForIntervention(i));
		}		
		return Calculator.moyenne(value);
	}
}
